package com.employee.web;

import com.employee.context.BaseContext;
import com.employee.utils.JwtUtils;
import io.jsonwebtoken.Claims;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

/**
 *  自定义拦截器
 */
@Component
public class LoginCheckInterceptor implements HandlerInterceptor {

    // 目标资源方法执行前执行。 返回true：放行    返回false：不放行
    @Override
    public boolean preHandle(
            HttpServletRequest request,
            HttpServletResponse response,
            Object handler
    ){
        // 判断当前拦截到的是Controller的方法还是其他资源
        if (!(handler instanceof HandlerMethod)) {
            //当前拦截到的不是动态方法，直接放行
            return true;
        }
        // 1.获取请求url
        // 2.判断请求url中是否包含login，如果包含，说明是登录操作，放行
        // 3.获取请求头中的令牌（token）
        String token = request.getHeader("Authorization");
        System.out.println(token);
        // 2、校验令牌
        try {
            Claims claims = JwtUtils.parseJWT(token);
            Long empId = Long.valueOf(claims.get("id").toString());
            // 将用户id存入ThreadLocal
            BaseContext.setCurrentId(empId);
            System.out.println("admin拦截器 - 将用户id: " + empId + " 存入ThreadLocal");
            // 通过，放行
            return true;
        } catch (Exception ex) {
            // 校验失败，返回401状态码
            response.setStatus(401);
            System.out.println("admin拦截器 - token校验失败，返回401状态码");
            return false;
        }
    }


    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 结束了，清楚线程变量，防止内存泄漏
        BaseContext.removeCurrentId();
    }

}
